// const arr = [10, 12, 15, 21];
// for (var i = 0; i < arr.length; i++) {
//     setTimeout(function() {
//         console.log('The index of this number is: ' + i);
//     }, 3000);
// }
// const arr = [10, 12, 15, 21];
// for (let i = 0; i < arr.length; i++) {
//     setTimeout(function() {
//         console.log('The index of this number is: ' + i);
//     }, 3000);
// }
// function cool(age,name,like) {
//     const args = new Set(arguments)
//     console.log(...arguments);
// }
// cool(12,'Jack','Apple');
// let cools = new Set();
// cools.add(5)
// cools.add("some test")
// let o = {a:1,b:2};
// cools.add(o)
// cools.add({a:1,b:2})
//
// for (let [key,value] of cools.entries())  console.log(key)
// let arr = [NaN,1,2];
// let [a='默认',b,c] = arr;
// console.log(a)
// console.log(b)
// console.log(c)
// let a = [0,1,2];
// let b = [3,4,5];
// let c = a.concat(b)
// console.log(c)
// let d = [...a,...b]
// console.log(d)
// let a = [0,1,2,3];
// let b = a;// 相当于把a在内存中的地址给了b，从而修改的都是同一个地址中的内容
// b.push(4);
// console.log(a);
// console.log(b);
// let a = [0,1,2,3];
// let b = [...a];// 相当于把a的内容通过结构赋值的方法克隆一份到b中，所以是新开一个内存地址，两者之间并不影响
// b.push(4);
// console.log(a);
// console.log(b);
// let {name:Name,age} = {age:18,name: 'str'};// 对象的解构是根据他们的key值来进行的
//
// console.log(Name);
// console.log(age);
// let name,age
// ({name,age} = {name: 'str',age:18});
// console.log(name);
// console.log(age);
// let {name="str",age} = {name:'stttt',age:28}
// console.log(name);
// console.log(age);
// function sum(a,b,...args) {
//     console.log(a);
//     console.log(b);
//     console.log(args);
//   console.log(eval(args.join('+')))
// }
// sum(1,2,3,4,5,6)
// function max(...args) {
//     return Math.max.apply(null,args);
// }
// function max(...args){
//     return Math.max(...args)
// }
// console.log(max(1,2,3,4,5,6))
// let name = {name:'Jack'};
// let age = {age:18};
// let person = {};
// Object.assign(person,name,age,{sex:'男'});
// console.log(person);
// const naiveList = ['1500','1350','4500'];
// const castedList = naiveList.map(Number);
// console.log('castedList',castedList)
// const makeSweeter = (sweetItem) => {return sweetItem * 2};
// const sweetArray = [2,3,4,5,25];
// const sweeterArray = sweetArray.map(makeSweeter);
// console.log(sweeterArray);
// var y = 1;
// if (eval(function f(){}))
// {
//     y += typeof F;
// }
// console.log(y);
// class Phone {
//     constructor() {
//
//     }
//     static getPhone(){
//         console.log("I'm a phone.");
//     }
// }
//
// class MI extends Phone {
//     constructor() {
//         super();
//         console.log("I'm a phone designed by xiaomi");
//     }
// }
//
// let mi8 = new MI();
// let phone = new Phone();
// phone.getPhone();
// const user = {
//     name: 'John',
//     email: 'john@awesome.com,',
//     plan: 'Pro'
// };
// const userStr = JSON.stringify(user);
//
// const newStr1 = JSON.parse(userStr,(key,value)=>{
//     if(typeof value === 'string'){
//         return value.toUpperCase();
//     }
//     return value
// })
// function replacer(key,value){
//     if( key === 'email'){
//         return undefined
//     }
//     return value
// }
// const newStr = JSON.stringify(user,null,'....')
// console.log(JSON.parse(newStr))
// var obj = {
//     foo: 'foo',
//     toJSON:function(){
//         return 'bar';
//     }
// }
// console.log(JSON.stringify(obj))
// console.log(JSON.stringify({x:obj}))
var censor = function(key,value){
    if(typeof(value) == 'function'){
        return Function.prototype.toString.call(value)
    }
    return value;
}
var foo = {bar:"1",baz:3,o:{name:'xiaoli',age:21,info:{sex:'男',getSex:function(){return 'sex';}}}};
console.log(JSON.stringify(foo,censor,4))
